Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

core/model/src/commonMain/kotlin/org/meshtastic/core/model/util/WireExtensions.kt 4e15ef1c7f68f8c683fe8b7ff741a5167e154d2e (4e15ef1c) Text, 4.58 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.model.util

Tff7b72import T7ee787co.touchlab.kermit.Logger
Tff7b72import T7ee787com.squareup.wire.Message
Tff7b72import T7ee787com.squareup.wire.ProtoAdapter
Tff7b72import T7ee787okio.ByteString
Tff7b72import T7ee787okio.ByteString.Companion.toByteString

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffunusedTa5d6ff"Tb4b4b4) T8b949e// These are extension functions meant to be imported elsewhere
Tff7b72fun Tff7b72<Te6edf3T Tb4b4b4: Te6edf3Message<Te6edf3TTb4b4b4, *Tff7b72>> Td2a8ffProtoAdapterTff7b72<Te6edf3TTff7b72>Tb4b4b4.Te6edf3decodeOrNullTb4b4b4(Te6edf3bytesTb4b4b4: Te6edf3ByteString?Tb4b4b4, Te6edf3loggerTb4b4b4: Te6edf3Logger? Tff7b72= Tff7b72nullTb4b4b4)Tb4b4b4: Te6edf3T? Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3bytes Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tff7b72return Tff7b72null
Tff7b72return Te6edf3runCatching Tb4b4b4{ Te6edf3decodeTb4b4b4(Te6edf3bytesTb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3onFailure Tb4b4b4{ Te6edf3exception Tff7b72-Tff7b72> Te6edf3loggerTff7b72?.Te6edf3eTb4b4b4(Te6edf3exceptionTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffFailed to decode proto messageTa5d6ff" Tb4b4b4} Tb4b4b4}
Tb4b4b4.Te6edf3getOrNullTb4b4b4(Tb4b4b4)
Tb4b4b4}

T8b949e/**
* Safely decode a proto message from [ByteArray], returning null on error.
*
* Convenience overload for ByteArray inputs, automatically converting to ByteString.
*
* @param bytes The ByteArray to decode, or null
* @param logger Optional logger for error reporting
* @return The decoded message, or null if bytes is null or decoding fails
*/
Tff7b72fun Tff7b72<Te6edf3T Tb4b4b4: Te6edf3Message<Te6edf3TTb4b4b4, *Tff7b72>> Td2a8ffProtoAdapterTff7b72<Te6edf3TTff7b72>Tb4b4b4.Te6edf3decodeOrNullTb4b4b4(Te6edf3bytesTb4b4b4: Te6edf3ByteArray?Tb4b4b4, Te6edf3loggerTb4b4b4: Te6edf3Logger? Tff7b72= Tff7b72nullTb4b4b4)Tb4b4b4: Te6edf3T? Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3bytes Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tff7b72return Tff7b72null
Tff7b72return Te6edf3decodeOrNullTb4b4b4(Te6edf3bytesTb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3loggerTb4b4b4)
Tb4b4b4}

T8b949e/**
* Check if an encoded message would fit within a size limit.
*
* More accurate than checking ByteArray.size() as it uses Wire's actual encoding size calculation, which accounts for
* variable-length encoding.
*
* Useful for:
* - Validating packet sizes before transmission
* - Enforcing payload limits
* - Better error messages with actual vs expected sizes
*
* Example:
* ```
* val data = Data(portnum = PortNum.TEXT_MESSAGE_APP, payload = bytes)
* if (!Data.ADAPTER.isWithinSizeLimit(data, MAX_PAYLOAD)) {
* error("Payload too large")
* }
* ```
*
* @param message The message to check
* @param maxBytes Maximum allowed bytes
* @return true if encodedSize(message) <= maxBytes
*/
Tff7b72fun Tff7b72<Te6edf3T Tb4b4b4: Te6edf3Message<Te6edf3TTb4b4b4, *Tff7b72>> Td2a8ffProtoAdapterTff7b72<Te6edf3TTff7b72>Tb4b4b4.Te6edf3isWithinSizeLimitTb4b4b4(Te6edf3messageTb4b4b4: Te6edf3TTb4b4b4, Te6edf3maxBytesTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Tffa657Boolean Tff7b72=
Te6edf3encodedSizeTb4b4b4(Te6edf3messageTb4b4b4) Tff7b72<Tff7b72= Te6edf3maxBytes

T8b949e/**
* Get the estimated encoded size of a message in bytes.
*
* This accounts for variable-length encoding and is more accurate than just using ByteArray.size(). Useful for size
* validation and logging.
*
* @param message The message to measure
* @return Size in bytes when encoded
*/
Tff7b72fun Tff7b72<Te6edf3T Tb4b4b4: Te6edf3Message<Te6edf3TTb4b4b4, *Tff7b72>> Td2a8ffProtoAdapterTff7b72<Te6edf3TTff7b72>Tb4b4b4.Te6edf3sizeInBytesTb4b4b4(Te6edf3messageTb4b4b4: Te6edf3TTb4b4b4)Tb4b4b4: Tffa657Int Tff7b72= Te6edf3encodedSizeTb4b4b4(Te6edf3messageTb4b4b4)

T8b949e/**
* Convert a proto message to a pretty-printed string representation.
*
* This uses Wire's built-in toString() which provides a human-readable format with field names and values. Useful for
* debugging and logging.
*
* Example output:
* ```
* Position{latitude_i=371234567, longitude_i=-1220987654, altitude=15}
* ```
*
* @param message The message to format
* @return String representation of the message
*/
Tff7b72fun Tff7b72<Te6edf3T Tb4b4b4: Te6edf3Message<Te6edf3TTb4b4b4, *Tff7b72>> Td2a8ffProtoAdapterTff7b72<Te6edf3TTff7b72>Tb4b4b4.Te6edf3toReadableStringTb4b4b4(Te6edf3messageTb4b4b4: Te6edf3TTb4b4b4)Tb4b4b4: Tffa657String Tff7b72= Te6edf3messageTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)

T8b949e/**
* Log a proto message with readable formatting.
*
* Useful for debugging packet contents during development.
*
* Example:
* ```
* Position.ADAPTER.logMessage(position, Logger, "Received position update")
* ```
*
* @param message The message to log
* @param logger The logger instance
* @param prefix Optional prefix message
*/
Tff7b72fun Tff7b72<Te6edf3T Tb4b4b4: Te6edf3Message<Te6edf3TTb4b4b4, *Tff7b72>> Td2a8ffProtoAdapterTff7b72<Te6edf3TTff7b72>Tb4b4b4.Te6edf3logMessageTb4b4b4(Te6edf3messageTb4b4b4: Te6edf3TTb4b4b4, Te6edf3loggerTb4b4b4: Te6edf3LoggerTb4b4b4, Te6edf3prefixTb4b4b4: Tffa657String Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3prefixStr Tff7b72= Tff7b72if Tb4b4b4(Te6edf3prefixTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Ta5d6ff"Tffd700$Te6edf3prefixTa5d6ff: Ta5d6ff" Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3loggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Tffd700$Te6edf3prefixStrTffd700${Te6edf3toReadableStringTb4b4b4(Te6edf3messageTb4b4b4)Tffd700}Ta5d6ff" Tb4b4b4}
Tb4b4b4}

T8b949e/**
* Get a compact single-line string representation for JSON/API serialization.
*
* Converts the proto message to a single-line format by replacing newlines. Useful for compact logging and API
* payloads.
*
* @param message The message to format
* @return Single-line string representation
*/
Tff7b72fun Tff7b72<Te6edf3T Tb4b4b4: Te6edf3Message<Te6edf3TTb4b4b4, *Tff7b72>> Td2a8ffProtoAdapterTff7b72<Te6edf3TTff7b72>Tb4b4b4.Te6edf3toOneLinerTb4b4b4(Te6edf3messageTb4b4b4: Te6edf3TTb4b4b4)Tb4b4b4: Tffa657String Tff7b72= Te6edf3messageTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff'\n'Tb4b4b4, Ta5d6ff' 'Tb4b4b4)

Served by rngit 1.5.0 - Generated in 0.05s